package IHM;

import java.util.ArrayList;
import java.util.GregorianCalendar;

import Carte.Calendrier;
import Carte.Trajet;
import Carte.Ville;
import Client.Reservation;
import Passager.Passager;
import Serveur.*;
import Transports.Avion;
import Transports.Bateau;
import Transports.Bus;
import Transports.Train;
import Transports.Transports;
import Transports.TypeTransport;

/**
 * Affiche une interface administrateur sous forme de console
 * 
 * @author Adrian GUARRERA
 *
 */
public class ConsoleAdmin {
	
	Serveur serveur;

	public ConsoleAdmin(Serveur serveur) {
		this.serveur = serveur;
	}

    /**
     * Affiche la partie IHM console de l'admin
     */
    public void adminConsole(){
		int choixAdmin = ScannerUtiles.acquerirInfoInteger("->Mode administrateur:\n" +
				"   1 -> Consulter...\n" +
				"   2 -> Creer...\n" +
				"   3 -> Modifier...\n" +
				"   4 -> Supprimer...\n" +
				"   0 -> retour menu");
		switch(choixAdmin){
			case 1:
				menuConsulter();
				break;
			case 2:
				menuCreer();
				break;
			case 3:
				menuModifier();
				break;
			case 4:
				menuSupprimer();
				break;
			default:
				break;
		}
    }
    
    /**
     * Affiche un menu pour consulter les differentes informations
     */
    public void menuConsulter(){
		int choix = ScannerUtiles.acquerirInfoInteger("Que voulez-vous consulter:\n" +
				"   1 -> les trajets\n" +
				"   2 -> les transports\n" +
				"   3 -> les passagers\n" +
				"   4 -> les reservations\n" +
				"   0 -> retour menu");
		switch(choix){
		case 1:
			consulterTrajets();
			break;
		case 2:
			consulterTransports();
			break;
		case 3:
			consulterPassagers();
			break;
		case 4:
			consulterReservations();
			break;
		default:
			break;
		}
    }

    /**
     * Affiche un menu pour creer differentes informations
     */
    public void menuCreer(){
		int choix = ScannerUtiles.acquerirInfoInteger("Que voulez-vous creer:\n" +
				"   1 -> Un trajet\n" +
				"   2 -> Un transport\n" +
				"   3 -> Un passager\n" +
				"   0 -> retour menu");
		switch(choix){
		case 1:
			creerTrajet();
			break;
		case 2:
			creerTransport();
			break;
		case 3:
			creerPassager();
			break;
		default:
			break;
		}
    }

    /**
     * Affiche un menu pour modifier les differentes informations
     */
    public void menuModifier(){
		int choix = ScannerUtiles.acquerirInfoInteger("Que voulez-vous modifier:\n" +
				"   1 -> Un transport\n" +
				"   2 -> Un passager\n" +
				"   0 -> retour menu");
		switch(choix){
		case 1:
			modifierTransport();
			break;
		case 2:
			modifierPassager();
			break;
		default:
			break;
		}
    }
 
    /**
     * Affiche un menu pour supprimer les differentes informations
     */
    public void menuSupprimer(){
		int choix = ScannerUtiles.acquerirInfoInteger("Que voulez-vous supprimer:\n" +
				"   1 -> Un trajet\n" +
				"   2 -> Un transport\n" +
				"   3 -> Un passager\n" +
				"   4 -> Une reservation\n" +
				"   0 -> retour menu");
		switch(choix){
		case 1:
			supprimerTrajet();
			break;
		case 2:
			supprimerTransport();			
			break;
		case 3:
			supprimerPassager();
			break;
		case 4:
			supprimerReservation();
			break;
		default:
			break;
		}
    }
	
	/**
	 * Cree un transport dans le serveur
	 * @return
	 */
	public Transports creerTransport() {
		//Demande le type de transport
		TypeTransport type = choixTypeTransport();

		//Demander le prix du billet
		Double prix = ScannerUtiles.acquerirInfoDouble("Quel est le prix du billet?");

		// Demander la capacite du transport
		int capacite = ScannerUtiles.acquerirInfoInteger("Entrez la capacite du nouveau transport");
		
		Transports transport = null;
		switch(type){
			case AVION:
				transport = new Avion(serveur, prix, capacite);
				break;
			case BATEAU:
				transport = new Bateau(serveur, prix, capacite);
				break;
			case BUS:
				transport = new Bus(serveur, prix, capacite);
				break;
			case TRAIN:
				transport = new Train(serveur, prix, capacite);
				break;
		}
		System.out.println("Votre transport a ete cree avec succes!");		
		return transport;
	}

	/**
	 * Cree un trajet dans le serveur
	 * @return
	 */
	public void creerTrajet() {

		// ville de depart du trajet
		Ville villeDepart;
		// ville d'arrive du trajet
		Ville villeArrive;
		// date de depart
		GregorianCalendar Datedepart;
		// date d'arrive
		GregorianCalendar Datearrive;
		// le transport du trajet
		Transports transport;

		String temp;
		
		// Demander la ville de depart
		Ville.showAll();
		do {
			temp = ScannerUtiles.acquerirInfo("Entrez le nom de la ville de depart parmi les villes");
			villeDepart = Ville.toVille(temp);
			}while(villeDepart.equals(Ville.DEFAUT));

		// Demander la ville d'arrive
		do {
			temp = ScannerUtiles.acquerirInfo("Entrez le nom de la ville d'arrive parmi les villes");
			villeArrive = Ville.toVille(temp);
		}while(villeDepart.equals(Ville.DEFAUT));

		// Demander la distance entre les deux villes
		int distance = ScannerUtiles.acquerirInfoInteger("Entrez la distance separant les deux villes");
		
		do{
			System.out.println("La date de depart?:");
			Datedepart = saisiDate();
			System.out.println("La date d'arrivee?:");
			Datearrive = saisiDate();	
			
			if(!Calendrier.dateBefore(Datedepart, Datearrive)) System.out.println("La date d'arrivee est " +
					"inferieure a la date de depart");
		}while(!Calendrier.dateBefore(Datedepart, Datearrive));

		// Demander le transport du trajet
		boolean transportExistant = ScannerUtiles.ouiOuNon("Voulez-vous choisir un transport deja existant?");
		if (transportExistant) {
			serveur.displayAllTransport();
			
			int choixTransp;
			while (true) {
				try {
					choixTransp = ScannerUtiles.acquerirInfoInteger("Entrez le numero du transport choisi");
					break;
				} catch (Exception e) {
					System.out.println("Vous avez fait une erreur de saisi veuillez entrer un chiffre");
				}
			}
			transport = Transports.getTransport(serveur.getListeTransport(), choixTransp);
		} 
		else {
			transport = creerTransport();
		}
		int idTransport=transport.getIdTransport();
		System.out.println("Votre Trajet a bien ete ajoute");
		new Trajet(serveur,villeDepart, villeArrive, Datedepart, Datearrive,idTransport,distance);
	}
	
	public TypeTransport choixTypeTransport(){
		TypeTransport type;
		int numtype;
		TypeTransport.showAll();
		do{
			numtype = ScannerUtiles.acquerirInfoInteger("Choisir le nouveau type de transport") ; 
		}while(numtype > 4 || numtype < 1);

		// Assigner le type de trajet
		switch (numtype){
		case 1 :
			type = TypeTransport.AVION;
			break;
		case 2:
			type = TypeTransport.BATEAU;
			break;
		case 3:
			type = TypeTransport.BUS;
			break;
		case 4:
			type = TypeTransport.TRAIN;
			break;
		default:
			type = TypeTransport.AVION;
			break;
		}
		return type;
	}
	
	public GregorianCalendar saisiDate(){
		int Year, Month, Day, Hours, Minutes;
		do{
			// Demander une date
			Year = ScannerUtiles.acquerirInfoInteger("Entrez l'annee?");
			Month = ScannerUtiles.acquerirInfoInteger("Le mois?");
			Day = ScannerUtiles.acquerirInfoInteger("Le jour?");
			Hours = ScannerUtiles.acquerirInfoInteger("L'heure?");
			Minutes = ScannerUtiles.acquerirInfoInteger("Et les minutes?");

			if(!Calendrier.dateValide(Year, Month, Day, Hours, Minutes)) System.out.println("Veuillez saisir une date valide");
		}while(!Calendrier.dateValide(Year, Month, Day, Hours, Minutes));
		return Calendrier.ValuesToGregorian(Year, Month, Day, Hours, Minutes);
	}
	
	
    /**
     * Permet de creer un passager
     * 
     */
    public void creerPassager(){
    	String nom = ScannerUtiles.acquerirInfo("Son nom?");
    	String prenom = ScannerUtiles.acquerirInfo("Son prenom?");
    	serveur.addPassager(nom, prenom);
    }
	
	
    public ArrayList<Trajet> consulterTrajets(){
    	ArrayList<Trajet> listeTrajets = serveur.getListeTrajet();  	
    	int entierafficher = 0;
        for (Trajet trajet : listeTrajets) {
            System.out.println(entierafficher + " : " + trajet);
            entierafficher++;
        }
        return listeTrajets;
    }
    
    public ArrayList<Transports> consulterTransports(){
    	ArrayList<Transports> listeTransports = serveur.getListeTransport();    	
    	int entierafficher = 0;
        for (Transports transport : listeTransports) {
            System.out.println(entierafficher + " : " + transport);
            entierafficher++;
        }
        return listeTransports;
    }
    
    public ArrayList<Passager> consulterPassagers(){
    	ArrayList<Passager> listePassagers = serveur.getListePassager();   	
    	int entierafficher = 0;
        for (Passager passager : listePassagers) {
            System.out.println(entierafficher + " : " + passager);
            entierafficher++;
        }
        return listePassagers;
    }    
    
    public ArrayList<Reservation> consulterReservations(){
    	ArrayList<Reservation> listeReservations = serveur.getListeReservations();   	
    	int entierafficher = 0;
        for (Reservation reservation : listeReservations) {
            System.out.println(entierafficher + " : " + reservation);
            entierafficher++;
        }
        return listeReservations;
    }
    
    public void supprimerTrajet(){
    	ArrayList<Trajet> listeTrajets = consulterTrajets();
    	if(listeTrajets.size() == 0 || listeTrajets == null){
    		System.out.println("Il n'y a aucun passagers!");
    	}else{
	    	int supprimer = 0;
	    	do{
	        	supprimer = ScannerUtiles.acquerirInfoInteger("Quel trajet voulez-vous supprimer?");
	    	}while(supprimer < 0 || supprimer >= listeTrajets.size());
	    	Trajet aSupprimer = listeTrajets.get(supprimer);
	    	System.out.println(aSupprimer.toString());
	    	boolean confirmation = ScannerUtiles.ouiOuNon("Voulez-vous vraiment supprimer ce trajet?");
	    	if(confirmation){
	    		serveur.removeTrajet(aSupprimer);
	    		System.out.println("Trajet supprime!");
	    	}else{
	    		System.out.println("Operation annulee");
	    	}
    }
    }
    
    public void supprimerTransport(){
    	ArrayList<Transports> listeTransports = consulterTransports();
    	if(listeTransports.size() == 0 || listeTransports == null){
    		System.out.println("Il n'y a aucun transport!");
    	}else{
	    	int supprimer = 0;
	    	do{
	        	supprimer = ScannerUtiles.acquerirInfoInteger("Quel transport voulez-vous supprimer?");
	    	}while(supprimer < 0 || supprimer >= listeTransports.size());
	    	Transports aSupprimer = listeTransports.get(supprimer);
	    	System.out.println(aSupprimer.toString());
	    	boolean confirmation = ScannerUtiles.ouiOuNon("Voulez-vous vraiment supprimer ce transport?");
	    	if(confirmation){
	    		if(serveur.removeTransport(aSupprimer)){
	    			System.out.println("Ce transport ne peut pas etre supprime, il est utilise dans un trajet!");
	    		}else{
	    			System.out.println("Transport supprime!");
	    		}
	   		
	    	}else{
	    		System.out.println("Operation annulee");
	    	}
    	}
    }
    
    public void supprimerPassager(){
    	ArrayList<Passager> listePassagers = consulterPassagers();
    	if(listePassagers.size() == 0 || listePassagers == null){
    		System.out.println("Il n'y a aucun passagers!");
    	}else{
	    	int supprimer = 0;
	    	do{
	        	supprimer = ScannerUtiles.acquerirInfoInteger("Quel passager voulez-vous supprimer?");
	    	}while(supprimer < 0 || supprimer >= listePassagers.size());
	    	Passager aSupprimer = listePassagers.get(supprimer);
	    	System.out.println(aSupprimer.toString());
	    	boolean confirmation = ScannerUtiles.ouiOuNon("Voulez-vous vraiment supprimer ce passager?");
	    	if(confirmation){
	    		serveur.forceRemovePassager(aSupprimer);
	    		System.out.println("Passager supprime!");
	    	}else{
	    		System.out.println("Operation annulee");
	    	}
    	}
    }
    
    
    public void supprimerReservation(){
    	ArrayList<Reservation> listeReservations = consulterReservations();
    	if(listeReservations.size() == 0 || listeReservations == null){
    		System.out.println("Il n'y a aucune reservation!");
    	}else{
	    	int supprimer = 0;
	    	do{
	        	supprimer = ScannerUtiles.acquerirInfoInteger("Quele reservation voulez-vous supprimer?");
	    	}while(supprimer < 0 || supprimer >= listeReservations.size());
	    	Reservation aSupprimer = listeReservations.get(supprimer);
	    	System.out.println(aSupprimer.toString());
	    	boolean confirmation = ScannerUtiles.ouiOuNon("Voulez-vous vraiment supprimer cette reservation?");
	    	if(confirmation){
	    		serveur.removeReservation(aSupprimer.getIdReservation());
	    		System.out.println("Reservation supprimee!");
	    	}else{
	    		System.out.println("Operation annulee");
	    	}
    	}
    }
    
    
    public void modifierPassager(){
    	ArrayList<Passager> listePassagers = consulterPassagers();
    	if(listePassagers.size() == 0 || listePassagers == null){
    		System.out.println("Il n'y a aucun passagers!");
    	}else{
	    	int modifier = 0;
	    	do{
	    		modifier = ScannerUtiles.acquerirInfoInteger("Quel passager voulez-vous modifier?");
	    	}while(modifier < 0 || modifier >= listePassagers.size());
	    	Passager aModifier = listePassagers.get(modifier);
	    	System.out.println(aModifier.toString());
	    	String nNom = null, nPrenom = null;
	    	if(ScannerUtiles.ouiOuNon("Modifier le nom?")){	    	
	    		nNom = ScannerUtiles.acquerirInfo("Nouveau nom");
	    	}
	    	if(ScannerUtiles.ouiOuNon("Modifier le prenom?")){	    	
	    		nPrenom = ScannerUtiles.acquerirInfo("Nouveau prenom");
	    	}

	    	serveur.setPassager(aModifier, nNom, nPrenom);
	    	System.out.println("Passager modifie!");
    	}
    }
    
    public void modifierTransport(){
    	ArrayList<Transports> listeTransports = consulterTransports();
    	if(listeTransports.size() == 0 || listeTransports == null){
    		System.out.println("Il n'y a aucun transport!");
    	}else{
	    	int modifier = 0;
	    	do{
	    		modifier = ScannerUtiles.acquerirInfoInteger("Quel transport voulez-vous modifier?");
	    	}while(modifier < 0 || modifier >= listeTransports.size());
	    	Transports aModifier = listeTransports.get(modifier);
	    	System.out.println(aModifier.toString());
	    	
	    	int capacite = 0;
	    	double prixBillet = 0.0;
	    	TypeTransport type = null;
	    	
	    	if(ScannerUtiles.ouiOuNon("Modifier la capacite transport?")){
	    		capacite = ScannerUtiles.acquerirInfoInteger("Entrez la nouvelle capacite du transport");
	    	}	    	
	    	if(ScannerUtiles.ouiOuNon("Modifier le prix du billet?")){
	    		prixBillet = ScannerUtiles.acquerirInfoDouble("Entrez le nouveau prix du transport");
	    	}	    	
	    	if(ScannerUtiles.ouiOuNon("Modifier le type de transport?")){
	    		type = choixTypeTransport();
	    	}
	    		
	    	serveur.setTransport(aModifier, capacite, prixBillet, type);
	    	System.out.println("Transport modifie!");
    	}
    }
}
